// 封装axios请求函数
import axios from 'axios'
import { Message } from 'element-ui';
// import router from '../router' // 引入路由文件

// 判断当前的运行环境 process.env.NODE_ENV
// isDev 为true 开发环境 --- npm run serve
// isDev 为false 非开发环境（测试环境，生产环境）- npm run build
const isDev = process.env.NODE_ENV === 'development'
console.log(isDev)
const request = axios.create({
    // 设置请求时长
    timeout: 20000
    // 根据环境 设置不同的baseURL
    // 配置了前端反向代理,直接'/api'代理了本地数据的请求接口,后边跟的是线上的接口地址,当isDev为false时就代表了上线了
    // baseURL: isDev ? '/api' : 'http://xx.xx.xx/api'
})

// 请求拦截器 - 所有的请求开始之前先到此处
request.interceptors.request.use((config) => {
    // 可以设置 加载的动画效果 的展示
    // 在必要的路由设置一些额外的参数 ---- token信息携带放在此处
    // 将token放到请求头中发送给服务器
    const info = JSON.parse(sessionStorage.getItem('information')) || null
    const token = info ? info.token : null
    if (token) {
        // 请求头携带token
        config.headers['Authorization'] = token
        config.headers['Accept'] = 'application/json';
    }
    // 添加请求拦截器(post只能接受字符串类型数据)
    if (config.method === 'post') {
        config.data = JSON.stringify(config.data)
    }
    console.log('正在加载....')
    return config
}, (error) => {
    return Promise.reject(error)
})

// 响应拦截器 --- 所有请求的相应先到此处
request.interceptors.response.use((response) => {
    // 判断一下响应中是否有 token，如果有就直接使用此 token 替换掉本地的 token。你可以根据你的业务需求自己编写更新 token 的逻辑
    let token = response.headers.authorization;
    if (token) {
        // 如果 header 中存在 token，那么触发 refreshToken 方法，替换本地的 token
        axios.defaults.headers.common['Authorization'] = token;
    }
    // 可以设置加载的动画效果的隐藏
    console.log('加载完毕.....')
    return response
}, (error) => {
    console.log(error.response,'请求错误')

// 错误的请求结果处理，这里的代码根据后台的状态码来决定错误的输出信息
    if (error && error.response) {
        switch (error.response.status) {
            case 400:
                error.message = '错误请求' ; Message('错误请求');
                break
            case 401:
                error.message = '未授权，请重新登录' ; Message('未授权，请重新登录');
                break
            case 403:
                error.message = '拒绝访问' ; Message('拒绝访问');
                break
            case 404:
                error.message = '请求错误,未找到该资源' ; Message('请求错误,未找到该资源');
                break
            case 405:
                error.message = '请求方法未允许' ; Message('请求方法未允许');
                break
            case 408:
                error.message = '请求超时' ; Message('请求超时');
                break
            case 500:
                error.message = '服务器端出错' ; Message('服务器端出错');
                break
            case 501:
                error.message = '网络未实现' ; Message('网络未实现');
                break
            case 502:
                error.message = '网络错误' ; Message('网络错误');
                break
            case 503:
                error.message = '服务不可用' ; Message('服务不可用');
                break
            case 504:
                error.message = '网络超时' ; Message('网络超时');
                break
            case 505:
                error.message = 'http版本不支持该请求' ; Message('http版本不支持该请求');
                break
            default:
                error.message = `连接错误${error.response.status}`   ; Message(`'连接错误'${error.response.status}`);
        }
    } else {
        error.message = "连接到服务器失败"; Message('连接到服务器失败');
    }
    console.log(error)
    return Promise.reject(error.message)
    // console.log('errcode', error.response.data.msg)
    // 注意,因为这个项目token错误的话控制台会报错,所以是写到error响应失败的区域中,若是不会报错的话则可以写到响应成功response区域中
    // 对错误token进行验证
    // 解构状态码
    // const errcode = error.response.data.msg * 1
    // console.log(errcode,'errcode')
    // 然后进行token的验证
    // token的验证主要是根据前端请求的时候携带的token进行数据请求的时候,返回的状态码来判断
    // 4600: 没有携带token值; 4601: token失效,请重新登录; 4602: token错误
    // if (errcode === 4600 || errcode === 4601 || errcode === 4602) {
    //     console.log('token错误')
    //     this.$message('登录状态失效,即将跳转至登录页面')
    //     // 跳转到登录页面
    //     setTimeout(() => {
    //         router.replace('/');//跳转到首页
    //     }, 3000)
    // }
    // return Promise.reject(error)
})
// 以request暴露出去
export default request